package config

import (
	"fmt"
	"go.uber.org/zap"
	"gopkg.in/yaml.v3"
	"os"
	"path/filepath"
)

// ReadConfig 读取配置文件
func ReadConfig() *Config {
	// 默认使用开发环境配置
	env := "dev"

	// 如果环境变量指定了环境，则使用环境变量指定的环境
	if envVar := os.Getenv("GO_ENV"); envVar != "" {
		env = envVar
	}

	// 配置文件路径
	configFile := fmt.Sprintf("config/settings.%s.yaml", env)

	// 如果环境变量指定了配置文件，则使用环境变量指定的配置文件
	if envConfig := os.Getenv("CONFIG_FILE"); envConfig != "" {
		configFile = envConfig
	}

	// 读取配置文件
	yamlFile, err := os.ReadFile(configFile)
	if err != nil {
		// 如果指定环境的配置文件不存在，尝试使用默认配置文件
		defaultConfig := "config/settings.dev.yaml"
		zap.S().Warnf("读取配置文件 %s 失败: %v，尝试使用默认配置文件 %s", configFile, err, defaultConfig)

		yamlFile, err = os.ReadFile(defaultConfig)
		if err != nil {
			zap.S().Warnf("读取默认配置文件失败: %v\n", err)
			return nil
		}
		configFile = defaultConfig
	}

	// 解析配置文件
	config := &Config{}
	err = yaml.Unmarshal(yamlFile, config)
	if err != nil {
		zap.S().Errorf("解析配置文件失败: %v\n", err)
		return nil
	}

	// 添加配置加载成功的日志
	zap.S().Infof("✅ 配置文件加载成功: %s", configFile)
	zap.S().Infof("🌍 当前环境: %s", env)
	zap.S().Infof("🚪 服务端口: %d", config.System.Port)

	return config
}

// ReadConfigWithOptions 如果需要使用命令行参数，可以添加一个函数，接收命令行参数作为参数
func ReadConfigWithOptions(configPath string) *Config {
	// 如果指定了配置文件路径，则使用指定的配置文件
	if configPath != "" {
		yamlFile, err := os.ReadFile(configPath)
		if err != nil {
			zap.S().Errorf("读取配置文件失败: %v", err)
			return nil
		}

		config := &Config{}
		err = yaml.Unmarshal(yamlFile, config)
		if err != nil {
			zap.S().Errorf("解析配置文件失败: %v", err)
			return nil
		}

		// 添加配置加载成功的日志
		zap.S().Infof("✅ 配置文件加载成功: %s", configPath)
		zap.S().Infof("🌍 当前环境: %s", filepath.Base(configPath))
		zap.S().Infof("🚪 服务端口: %d", config.System.Port)

		return config
	}

	// 否则使用默认配置
	return ReadConfig()
}
